package com.yc.thread;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 怎么处理中断
 */
public class Test9_ReInterrupted extends Thread {
    public static void main(String[] args) throws InterruptedException {
        //当前线程
        String threadName =Thread.currentThread().getName();
        Test9_ReInterrupted reInterrupt  = new Test9_ReInterrupted();
        System.out.println(printDate()+threadName+"线程启动");
        //启动新线程
        reInterrupt.start();

        //主线程休眠3s
        Thread.sleep(3000);
        System.out.println(printDate()+threadName+"发出中断信号，这只子线程中断");

        //对新线程设置线程中断
        reInterrupt.interrupt();//发送中断信号   //如果注释掉，则下面的while循环是死循环   主线程向子线程发了中断没有  -》是没有的

        //主线程休眠3s
        Thread.sleep(3000);
        System.out.println(printDate()+threadName+"运行结束");
    }

    private static String printDate() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date())+" ";
    }

    @Override
    public void run() {
        //取出当前线程的名字
        String threadName=Thread.currentThread().getName();
        int i =0;
        //for循环等待线程中断  只要当前线程不是中断，则继续。      是中断，则退出当前线程
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println(printDate()+threadName+"线程正在执行第："+(++i)+"次");
            try {
                //应该会执行3次
                //线程阻塞，如果线程收到中断信号将抛出异常
                Thread.sleep(1000);
            } catch (InterruptedException e) { //因为catch所以中断信号又恢复成了  false
                System.out.println(printDate()+threadName+"线程正在执行，静茹catch块处理");
                //检测线程是否中断
                System.out.println(printDate()+threadName+"的状态"+this.isInterrupted());//false

                //如果需要维护中断状态，则需要重新设置中断状态
                //TODO: 如果不需要，则不用调用    如果调用 interrupt()的话，则当前线程的状态变为中断，  这个while循环退出，程序结束
                //每一次执行完都会发中断
                Thread.currentThread().interrupt();//再发中断信号，trueTODO:如果注释这一段话，则中断不起作用，while循环仍会继续    想象一下，这样
            }
        }
        System.out.println(printDate()+threadName+"线程是否被中断："+this.isInterrupted());
        System.out.println(printDate()+threadName+"线程退出" );
    }
}
